/**
 * [调和平均数](https://en.wikipedia.org/wiki/Harmonic_mean)是一种
 * 通常用于计算比率平均值的均值函数。
 * 该均值通过取输入数字倒数算术平均数的倒数来计算。
 *
 * 这是一种[集中趋势度量](https://en.wikipedia.org/wiki/Central_tendency)：
 * 用于寻找一组数字的典型值或中心值的方法。
 *
 * 该函数的时间复杂度为`O(n)`，即线性时间，与数组长度成正比。
 *
 * @param {Array<number>} x 包含一个或多个数据点的样本
 * @returns {number} 调和平均数
 * @throws {Error} 如果x为空
 * @throws {Error} 如果x包含负数
 * @example
 * harmonicMean([2, 3]).toFixed(2) // => '2.40'
 */
function harmonicMean(x) {
    if (x.length === 0) {
        throw new Error("harmonicMean函数至少需要一个数据点");
    }

    let reciprocalSum = 0;

    for (let i = 0; i < x.length; i++) {
        // 调和平均数仅对正数有效
        if (x[i] <= 0) {
            throw new Error("harmonicMean函数要求输入必须为正数");
        }

        reciprocalSum += 1 / x[i];
    }

    // 用n除以倒数之和
    return x.length / reciprocalSum;
}

export default harmonicMean;
